from django import forms
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError


class LoginForm(forms.Form):
    """
    普通表单类，用户登录表单，不直接操作数据库
    """
    username = forms.CharField(
        max_length=11,  # 最大长度
        label='请输入您的手机号',  # 字段标签
        widget=forms.TextInput(
            attrs={
                'class': 'layui-input',  # LayUI输入框样式
                'placeholder': '请输入您的手机号',  # 占位提示文本
                'lay-verity': 'required|phone',  # LayUI验证规则：必填+手机号格式
                'id': 'username'  # 输入框ID
            }
        )
    )
    password = forms.CharField(
        max_length=20,
        label='请您输入密码',
        widget=forms.PasswordInput(
            attrs={
                'class': 'layui-input',
                'placeholder': '请您输入密码',
                'lay-verity': 'required|password',
                'id': 'password'
            }
        )
    )

    def clean_username(self):
        """
        自定义表单字段username的数据清洗函数
        只适用于username数据的清洗，函数名的格式必须clean_表单字段
        必须有return返回值
        """
        # 验证手机号是否是11位
        # 获取清洗后的数据
        username = self.cleaned_data['username']
        if len(username) == 11:
            return username
        else:
            # 验证失败就抛出异常，错误将会显示在表单上
            raise ValidationError('用户名为手机号')

    class LoginModelForm(forms.ModelForm):
        """
        模型表单类，继承自ModelForm，可以直接操作数据库
        """

        class Meta:
            """
            重新定义Meta类，分别设置属性model、fields、labels、error_messages、widgets
            并且自定义表单字段username的数据清洗函数
            """
            model = User  # 关联Django内置的User模型
            fields = ('username', 'password')  # 包含的模型字段
            # 字段标签，覆盖模型中的verbose_name
            labels = {
                'username': '请输入您的手机号',
                'password': '请输入您的密码',
            }
            # 错误信息
            error_messages = {
                '__all__': {
                    'required': '请输入内容',  # 必填字段错误
                    'invalid': '请检查输入内容'  # 格式错误
                },
            }
            # 自定义表单控件属性
            widgets = {
                'username': forms.widgets.TextInput(
                    attrs={
                        'class': 'layui-input',
                        'placeholder': '请输入您的手机号',
                        'lay-verify': 'required|phone',
                        'id': 'username'
                    }
                ),
                'password': forms.widgets.PasswordInput(
                    attrs={
                        'class': 'layui-input',
                        'placeholder': '请输入您的密码',
                        'lay-verify': 'required|password',
                        'id': 'password'
                    }
                )
            }

        def clean_username(self):
            username = self.cleaned_data['username']
            if len(username) == 11:
                return username
            else:
                raise ValidationError('用户名为手机号')